perm filename SCX.F4[MSS,LCS] blob sn#131204 filedate 1974-11-15 generic text, type T, neo UTF8
C  SUBRS.  SCMSS, TYPE

	SUBROUTINE SCMSS
	COMMON/SCM/V(78),I,LCNT,STAFF,JLIST(200),REND
C JLIST WILL SOMETIMES BE USED(WIPED OUT) FOR R(X,Y) OVERFLOW(>50 ITEMS.)
	DIMENSION RLIST(200),NOMOR(6),WARN(6),R(8,100)
	COMMON/SCX/RHY(4),JALPHA(19),RB,RC,JZ,IRHY,JD,KA,KB,IZ
	1/STF/RSTFAC(8),RSTJC/FRMT/F78F(1),FA1(1),FA5(1),IREAD
	1/XRN/RN(4000) /ALF/INP(72),ML /SC/J,L,MK 
	1,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG,IXX,ISEMI,JG
	1 ,VX(50),IAMP,K,KN,M,MODE,IBLA
      EQUIVALENCE (VX1,VX(1)),(INP1,INP(1)),(VX2,VX(2)),(VX3,VX(3))
	1,(VX4,VX(4)),(VX5,VX(5)),(JLIST,RLIST),(R1,R,RN(3001))
	1 ,(INP2,INP(2)),(INP3,INP(3)),(INP4,INP(4))
	1,(ISTAR,JALPHA(8)),(ICOL,JALPHA(9)),(IRP,
	1 JALPHA(6)),(ILP,JALPHA(5)),(NEG,JALPHA(2)),(IAT,JALPHA(16)),
	1 (IDOT,JALPHA(3))
	DATA KSLA/'/'/,IXX/'X'/,LCNT/1/,ISEMI/';'/,IBLA/' '/
	1,RHY/.5,.25,.125,.0625/,JALPHA/',','-','.','=','(',')','+',
	1 '*',':',';','"',' ','$','%','&','@','#','<','>'/
	IF(R1.EQ.16.)GO TO 16
C   FOR LETTERS
	IF(R1.NE.14.AND.R1.NE.144)GO TO 11
	MODE=1
	IBEAM=-1
	IZ=0
	IREAD=0
11	IF(MODE)GO TO 111
	IF(R1.NE.144.)GO TO (1,2,3,4,5,8024)MODE
2302	TYPE 80053
	IF(IREAD.EQ.1)REREAD 21141,L,INP
	IF(IREAD.EQ.0)TYPE 80051
	ACCEPT 80052,STAFF,L
	IF(STAFF.GE.99)GO TO 8027
C  TYPE 99 OR 999 TO ESCAPE WHEN IN READ-IN MODE
	IF(IREAD.EQ.1)GO TO 80041
	IF(LOOK(L)+LOOKD(L).EQ.0)GO TO 2302
	IREAD=1
	REWIND 22
	CALL IFILE(22,L)
2301	READ(22,21141,END=8027),L,INP
	IF(MODE.EQ.6)GO TO 1111
	IF(INP1.EQ.IBLA)GO TO 8006
	GO TO 80041
CC1112	REREAD 21141,L,INP
C  BECAUSE INP GOT WIPED OUT LAST TIME AROUND!
CC	GO TO 80041
1111	MODE=-1
	R(2,IZ+1)=-1.
	REND=1.0
	GO TO 8026
C   ABOVE ALLOWS MORE STAVES TO BE READ

111	IZ=0
	MODE=1
	GO TO 2302
C  WILL READ ANOTHER STAFF
80053	FORMAT(' TYPE STAFF NUM. '$)
80051	FORMAT('+AND FILE NAME  '$)
80052	FORMAT(F,A5)

2	TYPE 8008,IRHY
CC	GO TO 80042
	GO TO 1
3	TYPE 8002
330	ACCEPT 2114,N,L,INP3,INP4
	IF(N.EQ.'G')GO TO 8024
C  TYPE 'GO' TO PASS LATER ITEMS
	IF(N.EQ.'9'.OR.N.EQ.'B')GO TO 99
	IF(N.EQ.'Y')GO TO 1
	IF(N.NE.'N'.AND.N.NE.IBLA)GO TO 11
C  PICKS UP TYPOS
2000	MODE=MODE+1
	GO TO 11
4	TYPE 8023
	GO TO 330
5	TYPE 8022
	GO TO 330
8024	REND=-1.
	CALL HYDPOG(3)
C  ERASES NOTE NUMBERS
	IF(IBEAM)GO TO 8006
C  JUMP IF NO STEM NORMALIZATION NEEDED
C	IF(MODE.LT.3)GO TO 8006
	IZ=IZ+1
	R(1,IZ)=19.
	R(2,IZ)=STAFF
C   ADJUSTS NOTE STEMS, ETC.
8006	MODE=MODE+1
	IF(IREAD.EQ.1)GO TO 2301
8026	R(1,IZ+1)=100.
	IF(IREAD.EQ.2)REND=1.
273	IF(IREAD.NE.1)INP(2)=0
C  WHY =0 ABOVE?????
	RETURN


8027	IREAD=2
	STAFF=99.
C  STEMS ON ALL STAVES WILL NORMALIZE
	GO TO 8024
C  READER IS NOW FINISHED

99	IF(INP3.EQ.'9')GO TO 999
C   ELSE GET ANOTHER CHANCE TO SAY 'NO'
C  99=BACKUP,  999=ESCAPE
	MODE=MODE-1
	IF(MODE.GE.1)GO TO 11
999	DO 2222 K=1,IZ
2222	R(1,K)=99.
9999	REND=100
	GO TO 8026

8008	FORMAT(' TYPE ',I2,' RHYTHMS')
8002	FORMAT(' ADD BEAMS?  '$)
8022	FORMAT(' ADD SLURS?  '$)
8023	FORMAT(' ADD MARKS?  '$)
8011	FORMAT(1XI3,' MORE RHYTHMS NEEDED'/)
8015	K=IRHY-I+1
	TYPE 8011,K
	IF(IREAD.EQ.0)GO TO 11
	IZ=0
	IREAD=0
	MODE=5
	GO TO 8024

6	MODE=5
	IF(IREAD.NE.0)GO TO 8006
CC1	TYPE 8005
1	CALL TYPE
CC80042	ACCEPT 2114,INP
	IF(INP1.EQ.IBLA) GO TO 1
	IF(INP1.EQ.'9'.AND.INP2.EQ.'9')GO TO 99
C  TYPE '99' TO BACK-UP
80041	IF(MODE.GE.3)GO TO 133
	RETRO=-1.
	I=1
	PARENS=0
	MOT=0
      JZ=1  
	IAMP=0
C  IAMP IS 'BLANK LINE'FLAG ON PP1-3.
      KL=0  
      RA=0  
2408	MLX=1
	L=-1
	DO 2999 K=1,72
	N=INP(K)
	IF(N.EQ.IBLA)GO TO 2999
	L=0 
	IF(N.NE.ISTAR.AND.N.NE.ISEMI)GO TO 2999
C  READS 72 CHARS. INCLUDING *.
	INP(K+1)=ISEMI
	GO TO 1773
C  --- X/Y/Z* ---  WITH NO SEMICOLON WORKS FOR THIS PROG. ONLY!
2999	CONTINUE
	IF(IREAD.EQ.1)GO TO 8015
	GO TO 273
C   ERROR IF NO '*' OR ';' AT END OF LINE.

1299	IF(JZ.NE.0)GO TO 1773
7773	IF(IREAD.EQ.0)GO TO 77731
C   BYPASS IF NOT USING EDIT FILE
	READ(22,21141),L,INP
C   TO READ 2ND LINE OF NOTE INPUT, IF NEEDED
	GO TO 77732
CC77731	TYPE 8005
CC  	ACCEPT 2114,INP
77731	CALL TYPE
	IF(INP1.EQ.IBLA)GO TO 7773
77732	JM=-1
	JZ=0
	GO TO 2408
C   'LISTS' MUST END WITH * 
1773	JZ=0
	DBST=1.
17731	ML=MLX
	IF(PARENS.LE.0.)GO TO 975
C  PARENS=-1, OPENS; =1, CLOSES; =0, NONE
3362	PARENS=0
	MOT=I-LMOT
	IF(LCNT+MOT.LT.198)GO TO 33621
	DATA NOMOR/30H(' NO ROOM FOR MOTIVE ',A1/)   / 
	TYPE NOMOR,JMOT
	GO TO 1
33621	JLIST(LCNT+1)=MOT
	LCNT=LCNT+2
	DO 2140 JG=0,MOT-1
2140	RLIST(LCNT+JG)=V(LMOT+JG)
	LCNT=LCNT+MOT
	IF(IAMP)GO TO 3013
C  FOR CLOSE PARENS ON LAST ITEM
C   STORE MOTIVE IN RLIST ARRAY

975	DO 236 JDD=ML,72
	JD=JDD
	N=INP(JD)
C ((((())))) MAY 13,71 /Z (D4/E/X 2 3/) CS/ ETC.  CAN USE 26 LABELS.
	IF(N.NE.ILP.AND.N.NE.IRP.AND.N.NE.ICOL)GO TO 2361
	INP(JD)=IBLA
	IF(N.NE.ICOL)GO TO 1113
	DBST=-1.
	GO TO 236
C  FOR 'DOUBLE STOPS'
1113	L=JD-1
5113	IF(INP(L).NE.IBLA)GO TO 2113
	L=L-1
	GO TO 5113
2113	IF(N.EQ.')')GO TO 3361
C  ONLY ONE () AS YET,  NO NESTING
1140	JMOT=INP(L)
C   MOTIVE NAME
	DO 11401 JC=1,LCNT-1
	IF(JMOT.NE.JLIST(JC))GO TO 11401
C  FINDS DUPLICATE IDENTIFIER
11402	FORMAT(' MOTIVIC (',A1,') USED TWICE')
CC	GO TO 1
C  FOR BACKUP
11401	CONTINUE
	JLIST(LCNT)=JMOT
	PARENS=-1.
C   A PARENTH IS OPEN
	INP(L)=IBLA
	LMOT=I
C   LMOT IS CURRENT POINT IN V ARRAY
	GO TO 236
3361	IF(PARENS.NE.0)GO TO 33612
	DATA WARN/30H(' PARENTH ERROR - GOING ON'/)/
	TYPE WARN
33611	INP(JD)=IBLA
	GO TO 236
33612	PARENS=1.
C   SETS PARENS CLOSED FLAG
	GO TO 33611
C   NO INVERSIONS POSSIBLE NOW
2361	IF(N.NE.IAT)GO TO 5361
	DO 113 L=1,72
	K=JD+L
C   K IS USED AT 240!!!
	JG=INP(K)
	IF(JG.NE.NEG)GO TO 7113
	RETRO=0
	INP(K)=IBLA
	GO TO 113
7113	IF(JG.NE.IBLA)GO TO 4113
113	CONTINUE
4113	DO 6361 L=1,LCNT
	IF(JG.NE.JLIST(L))GO TO 6361
	VX1=0
	DO 40 M=JD+2,72
	JG=INP(M)
	IF(JG.EQ.IBLA)GO TO 40
	IF(JG.EQ.KSLA.OR.JG.EQ.ISEMI.OR.JG.EQ.ISTAR)GO TO 140
	ML=M
	GO TO 240
40	CONTINUE
240	JC=JM
	JM=-1
	INP(K)=IBLA
	JA=0
C   MUST BE ZERO IN SCANR
	CALL SCANR
	JM=JC
140	JC=1
	KN=L+2
	M=KN+JLIST(L+1)
	IF(RETRO)GO TO 940
	KN=M-1
	M=L+1
	JC=-1
	RETRO=-1.

940	Z=RLIST(KN)
	IF(VX1.EQ.0)GO TO 540
C  " @Q N "  WHERE N= 1/2 STEPS IN 'NOTES' OR MULT FACTOR IN OTHERS.
	IF(MODE.EQ.1)GO TO 440
C  MODE 1 IS NOTES, 2 IS RHY.
	V(I)=Z*VX1
	GO TO 7361
440	IF(Z.EQ.85.)GO TO 540
	V(I)=Z+VX1
	GO TO 7361
540	V(I)=Z
7361	I=I+1
	KN=KN+JC
	IF(KN.NE.M)GO TO 940

	RB=V(I-1)
	DO 8361 L=JD,72
	JG=INP(L)
	INP(L)=IBLA
	IF(JG.EQ.KSLA)GO TO 9361
	IF(JG.EQ.ISEMI)GO TO 93611
8361	IF(JG.EQ.ISTAR)IAMP=-1
9361	MLX=L
	IF(IAMP.EQ.0)GO TO 17731
	JZ=-1
93611	IF(IAMP)GO TO 3013
	GO TO 7773
6361	CONTINUE
	TYPE 6362,JG
	GO TO 11402
6362	FORMAT(' MOTIVIC (',A1,') NOT FOUND')
C @@@@@@@@@@@@@@@@@@@@@@@@@@
5361	IF(N.NE.KSLA)GO TO 636
	MLX=JD+1
	JZ=-1
	INP(JD)=ISEMI
436	IF(INP(MLX).NE.IBLA)GO TO 103
	MLX=MLX+1
	GO TO 436
636	IF(N.EQ.ISEMI)GO TO 103
936	IF(N.NE.IDOT)GO TO 736
	L=INP(JD+1)
	KL=NALF(L)
	IF(L.GT.0.AND.KL.GE.0.AND.KL.LE.9)GO TO 236
C   JUMP IF IT'S A NUMBER
	IF(MODE.EQ.2)INP(JD)=1
C :::::::::******* ↑↑↑↑ MODE #?
	GO TO 236
C   CHANGES DOTTED RHYTHMS TO '1'S.
736	IF(N.NE.ISTAR)GO TO 236
	IAMP=-1
	INP(JD)=ISEMI
	GO TO 103
236	CONTINUE

C   FOR ENTERING TEXT: 16, POS., STF., NT#., SIZE,  RHYTHM≠0
2114	FORMAT(72A1)
21141	FORMAT(I,72A1)
16	RC=R(4,1)
	IBEAM=-1
	RB=R(3,1)
	RNFLG=R(5,1)
C  RNFLG ≠0 CALLS NOTE NUM. SETUP
161	CALL NOZERO(RC)
	CALL TYPE
	DO 31 KN=72,1,-1
31	IF(INP(KN).NE.IBLA)GO TO 33
C  KN=NUM OF CHARACTERS
C  DON'T END WITH '*' IN 'LETTERS' INPUT!!!!!!!!
C  , - . = ( ) + * : ; " BLANK --THIS IS ORDER PAST ALPHAB.
C  $=UPPER CASE, %=LOWER, &=NON-ITALICS, @=ITALICS (48,49,50,51)
C  #=RETURN TO PRIMITVE FONT
33	L=1
	RA=R(2,1)
C   RA= ADDS UP TOTAL SPACE NEEDED
	RX=0
	RZ=-1
C   RB= NOTE #
C   RC= SIZE FACTOR
	IZ=0
CC	RBL=1.
368	IZ=IZ+1
CC	R(1,IZ)=16.
	R(2,IZ)=RA 
C  NEXT IS A MAGIC NUMBER FOR SPACING LETTERS.
	Y=39.6*RSTJC
C  RBL IS FOR CONTROL(NON-LETTERS, ETC.) CHARACTERS.
	R(3,IZ)=STAFF
	R(4,IZ)=RB
	R(5,IZ)=RC
CC	RBL=12.

	DO 364 JE=6,8
	Z=0
	DO 363 JD=1,4
361	IAMP=INP(L)
	IF(IAMP.NE.KSLA)GO TO 365
CC	RZ=-1
C  NEG. SPACE IS ENTERED IN P1 FOR EACH "FIRST" ITEM.
	JC=JD
	R(1,IZ)=0
	DO 367 KA=JE,8
	X=.990
	DO 366 K=JC,4
	Z=Z+X
366	X=X*100.0
	R(KA,IZ)=Z
	JC=1
367	Z=0
	L=L+1
C  L=CHARACTER COUNTER
	GO TO 369
365	DO 362 J=1,19
	IF(IAMP.NE.JALPHA(J))GO TO 362
	N=35+J
CC	IF(N.GT.47)RBL=RBL-1.
C  FOUND A SPECIAL CHARACTER.
	GO TO 39
362	CONTINUE
38	N=10-('A'-INP(L))/536870912
C   MAGIC NUMBER TO FIND LETTERS
	IF(N.LT.10)N=N+7
39	L=L+1
C  BLANK=99(=47)
	CALL SPACER(N,IFNT,RX,3.30537)
C  NUM↑↑=19.7/5.96  FOR BASIC SPACE PER LETTER.
C  GET SPACE FOR THIS LETTER.
	X=N
	IF(JD.EQ.2)X=X*100.
	IF(JD.EQ.4)X=X/100.
	IF(JD.EQ.1)X=X*10000.
363	Z=Z+X
364	R(JE,IZ)=Z
369	R(1,IZ)=RX*RZ
C PUT AWAY NEG. OR POS. SPACE
	RA=RA+RX+5
	RX=0
	RZ=1.
	IF(IAMP.EQ.KSLA)RZ=-RZ
	IF(L.LE.KN)GO TO 368
CC	R(1,IZ)=0

	INP(1)=0
C   SO IT WON'T FIND A COMMAND IN THE MAIN PROG.
	IF(RNFLG.NE.0)CALL SETLET
	GO TO 8024
C  PACKS 4 CHARS/WD, 3 WDS/ITEM.  ORDER=[, - . = ( )]  000000.00

5016	IF(IAMP.GE.0)GO TO 1299
	IF(PARENS.NE.0)GO TO 3362
C  PARENS ARE STILL OPEN?
	GO TO 3013
103	K=INP(ML)

C   LAST SECTION
	IF(K.EQ.ISEMI)GO TO 1014
C*********** MODE #?
	IF(K.NE.IBLA) GO TO 1899
	ML=ML+1
	GO TO 103
1899	JA=0
C   MUST BE ZERO IN SCANR
	CALL SCANR
      IF(VX1.EQ.-99.)GO TO 4022
	IF(MODE.NE.2)GO TO 17
C*********** MODE #?
2017	IF(VX1.EQ.10000.)GO TO 17
      VX1=4./VX1
	IF(JJ.NE.1)GO TO 2014
	V(I)=VX1
	GO TO 114
2014	DO 9006 L=2,JJ
	IF(VX(L).EQ.0)GO TO 17
9006	VX1=4./VX(L)+VX1
	JJ=1
17	V(I)=VX1
	IF(JJ.LE.1)GO TO 114
	IF(MODE.NE.1.OR.VX2.EQ.0)GO TO 171
C  JUMP IF RHY OR 'X 4' ETC.
	V(I)=-(VX1/100.+VX2/10000.)
C  PACKS 2 METER NUMS INTO ONE SLOT (-.1208 = 12/8)
	GO TO 114
171	L=VX(JJ)-1
	X=V(I)
	NL=I+1
	I=L+I
	DO 1017 K=NL,I
1017	V(K)=X
C   ADDS UP TOTAL   OF NOTES IN SEQ.
	GO TO 114
1014	V(I)=RB
114      RB=V(I)     
      I=I+1 
      GO TO 5016    
4022      JC=VX2+.3
      JD=VX3-.5
	IF(JJ.EQ.2)JD=1
C   JC=HOW MANY TIMES,  JD=HOW MANY NOTES 
      DO 1005 K=1,JD    
       NL=I+JC-1  
      DO 2005 L=I,NL    
2005  V(L)=V(L-JC)
1005      I=I+JC  
	RB=V(NL)
C  RB SAVES DATA FOR SLASH REPEAT FEATURE.
      GO TO 5016  

3013	IF(MODE.EQ.2.AND.I-1.NE.IRHY)GO TO 8015
C  WRONG NUMBER OF ITEMS
	V(I)=-99.
	IF(MODE.NE.1)GO TO 132
131	CALL NOTES
	GO TO 8006
132	CALL RHYTH
CC	IF(R1.EQ.50)GO TO 8024
C  =50 IS RHYTHM FOR TEXT
	IF(IREAD.EQ.0)CALL NUMB
	GO TO 8006
C   ACCENTS ARE IN BEAMS SUBROUTINE
133	CALL BEAMS
	IF(MODE.EQ.5)GO TO 8024
	IF(MODE.EQ.3)IBEAM=0
C  FOR  STEM NORMALIZATION
	GO TO 8006
	END

	SUBROUTINE TYPE
	COMMON/ALF/INP(72),ML
	TYPE 8005
	ACCEPT 2114,INP
2114	FORMAT(72A1)
8005	FORMAT(' TYPE --'/)
	END